From 4a27ad0fdc795c6d6053e4f0a966051024bcd2f8 Mon Sep 17 00:00:00 2001 From: robertlipe Date: Sat, 9 Feb 2013 05:24:52 +0000 Subject: [PATCH] Sketch in what a "real" XML writer might look like using QXmlStreamWriter. --- gpsbabel/geo.cc | 72 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/gpsbabel/geo.cc b/gpsbabel/geo.cc index a6c2d0f42..7ce2bc615 100644 --- a/gpsbabel/geo.cc +++ b/gpsbabel/geo.cc @@ -26,6 +26,11 @@ static waypoint* wpt_tmp; static gbfile* ofd; +#include +#include +QString ostring; +QXmlStreamWriter writer(&ostring); + static arglist_t geo_args[] = { {"deficon", &deficon, "Default icon name", NULL, ARGTYPE_STRING, ARG_NOMINMAX }, @@ -230,45 +235,55 @@ static void geo_wr_init(const char* fname) { ofd = gbfopen(fname, "w", MYNAME); + + //writer.setAutoFormatting(true); + writer.setAutoFormattingIndent(0); + writer.writeStartDocument(); + } static void geo_wr_deinit(void) { + writer.writeEndDocument(); + gbfputs(ostring.toUtf8().data(),ofd); gbfclose(ofd); + ofd = NULL; } static void geo_waypt_pr(const waypoint* waypointp) { - char* tmp; + writer.writeStartElement("waypoint"); - gbfprintf(ofd, "\n"); - gbfprintf(ofd, "", waypointp->shortname); - gbfprintf(ofd, "", waypointp->description); - gbfprintf(ofd, "\n"); + writer.writeStartElement("name"); + writer.writeAttribute("id", waypointp->shortname); + // TODO: this could be writeCharacters, but it's here for compat with pre + // Qt writer. + writer.writeCDATA(waypointp->description); + writer.writeEndElement(); - gbfprintf(ofd, "", - waypointp->latitude, - waypointp->longitude); - gbfprintf(ofd, "\n"); + writer.writeStartElement("coord"); + writer.writeAttribute("lat", QString::number(waypointp->latitude, 'f')); + writer.writeAttribute("lon", QString::number(waypointp->longitude, 'f')); + writer.writeEndElement(); + + writer.writeTextElement("type", deficon ? deficon : waypointp->icon_descr); - if (waypointp->icon_descr) { - gbfprintf(ofd, "%s\n", deficon ? deficon : waypointp->icon_descr); - } if (waypointp->url) { - tmp = xml_entitize(waypointp->url); - gbfprintf(ofd, "%s\n", - tmp); - xfree(tmp); + writer.writeStartElement("link"); + writer.writeAttribute("text ", "Cache Details"); + writer.writeCharacters(waypointp->url); + writer.writeEndElement(); } + if (waypointp->gc_data && waypointp->gc_data->diff) { - int v; + writer.writeTextElement("difficulty", + QString::number(waypointp->gc_data->diff/10)); + writer.writeTextElement("terrain", + QString::number(waypointp->gc_data->terr/10)); - gbfprintf(ofd, "%.1lf\n", - waypointp->gc_data->diff / 10.0); - gbfprintf(ofd, "%.1lf\n", - waypointp->gc_data->terr / 10.0); + int v = 1; switch (waypointp->gc_data->container) { case gc_unknown: v = 1; @@ -295,17 +310,24 @@ geo_waypt_pr(const waypoint* waypointp) v = 1; break; } - gbfprintf(ofd, "%d\n", v); + writer.writeTextElement("container", + QString::number(v)); } - gbfprintf(ofd, "\n"); + + writer.writeEndElement(); } static void geo_write(void) { - gbfprintf(ofd, "\n"); + writer.writeStartElement("loc"); + writer.writeAttribute("version", "1.0"); + // TODO: This could be moved to wr_init, but the pre GPX version put the two + // lines above this, so mimic that behaviour exactly. + writer.setAutoFormatting(true); + writer.writeAttribute("src", "EasyGPS"); waypt_disp_all(geo_waypt_pr); - gbfprintf(ofd, "\n"); + writer.writeEndElement(); } ff_vecs_t geo_vecs = { -- 2.30.2